package cn.itsource.org.domain;


import cn.itsource.basic.domain.BaseDomain;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;

/**
 * 部门的实体类
 *
 *
 *      表设计的原则
 *      1. 遵循三范式
 *      2. 常用字段 id，create_time, update_time, remark(备注)， 预留3个字段, 预留字段类型统一使用vachar
 *
 *       设计一张学生表
 *
 *       id,name,age,sex,number,create_time, update_time, remark, prop1,prop2,prop3
 *
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "t_department")
public class Department extends BaseDomain {

    //部门编号
    @NotBlank(message = "空的数据不准提交！！")                               // 非空校验
    private String sn;
    //部门名称
    @Size(min = 2,max = 5,message = "你长度不合适！！！")
    private String name;
    //部门路径
    private String dirPath;
    //部门状态：1启用,0禁用
    private Integer state = 1;
    //部门经理ID
    private Long managerId;
    //上级部门ID
    private Long parentId;

    @Transient               // 此注解当前字段是零时字段， 零时左数据的存储，不参与表的增删改
    private String managerName;      // 部门经理名称

    @Transient
    private String parentName;    // 上级部门名称

    @Transient
    private Long[] parentIds;    // 接受前端的部门数组类型的数据       [3,8,11,12]         3/8/11/12


    @Transient        // 零时字段
    @JsonInclude(JsonInclude.Include.NON_EMPTY)                           // 如果当前属性集合数据为空,那么就用null替代
    private List<Department> children = new ArrayList<>();
}
